package com.example.admin.config;

import com.aliyun.oss.OSS;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
import java.net.URL;

/**
 * 阿里云OSS上传工具类
 */
@Component
public class OSSUploadUtils {
    @Autowired
    private OSS ossClient;

    @Autowired
    private OSSConfig ossConfig;
    /**
     * 上传文件到OSS，支持自定义文件名
     *
     * @param file 文件对象
     * @param dir 目录
     * @param customFileName 自定义文件名
     * @return 文件访问路径
     */
    public String uploadFileWithCustomName(MultipartFile file, String dir, String customFileName) throws IOException {
        // 日期路径
        String datePath = new SimpleDateFormat("yyyy/MM/dd").format(new Date());
        // 完整路径
        String filePath = dir + "/" + datePath + "/" + customFileName;

        // 上传文件
        try (InputStream inputStream = file.getInputStream()) {
            // 创建元数据
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentType("application/pdf");
            metadata.setContentLength(file.getSize());

            // 创建上传请求
            PutObjectRequest putObjectRequest = new PutObjectRequest(
                    ossConfig.getBucketName(),
                    filePath,
                    inputStream,
                    metadata);

            // 执行上传
            ossClient.putObject(putObjectRequest);

            // 返回访问路径
            return  filePath;
        }
    }


    /**
     * 上传文件到OSS
     *
     * @param file 文件对象
     * @param dir 目录
     * @return 文件访问路径
     */
    public String uploadFile(MultipartFile file, String dir) throws IOException {
        // 获取文件名
        String originalFilename = file.getOriginalFilename();
        // 获取文件类型
        String fileType = originalFilename.substring(originalFilename.lastIndexOf("."));
        // 新文件名
        String fileName = UUID.randomUUID().toString().replaceAll("-", "") + fileType;
        // 日期路径
        String datePath = new SimpleDateFormat("yyyy/MM/dd").format(new Date());
        // 完整路径
        String filePath = dir + "/" + datePath + "/" + fileName;

        // 上传文件
        try (InputStream inputStream = file.getInputStream()) {
            // 创建元数据
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentType(getContentType(fileType));
            metadata.setContentLength(file.getSize());

            // 创建上传请求
            PutObjectRequest putObjectRequest = new PutObjectRequest(
                    ossConfig.getBucketName(),
                    filePath,
                    inputStream,
                    metadata);

            // 执行上传
            ossClient.putObject(putObjectRequest);

            // 返回访问路径
            return  filePath;
        }
    }

    /**
     * 上传文件到OSS
     *
     * @param originalFilename 原始文件名
     * @param dir 目录
     * @return 文件访问路径
     */
    public String uploadFile(InputStream inputStream, String originalFilename, String dir) throws IOException {
        // 获取文件类型
        String fileType = originalFilename.substring(originalFilename.lastIndexOf("."));
        // 新文件名
        String fileName = UUID.randomUUID().toString().replaceAll("-", "") + fileType;
        // 日期路径
        String datePath = new SimpleDateFormat("yyyy/MM/dd").format(new Date());
        // 完整路径
        String filePath = dir + "/" + datePath + "/" + fileName;

        // 创建元数据
        ObjectMetadata metadata = new ObjectMetadata();
        metadata.setContentType(getContentType(fileType));

        // 创建上传请求
        PutObjectRequest putObjectRequest = new PutObjectRequest(
                ossConfig.getBucketName(),
                filePath,
                inputStream,
                metadata);

        // 执行上传
        ossClient.putObject(putObjectRequest);

        // 返回访问路径
        return  filePath;
    }


    /**
     * 获取文件ContentType
     */
    private String getContentType(String fileType) {
        fileType = fileType.toLowerCase();
        if (fileType.equals(".pdf")) {
            return "application/pdf";
        } else if (fileType.equals(".doc")) {
            return "application/msword";
        } else if (fileType.equals(".docx")) {
            return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
        } else if (fileType.equals(".jpg") || fileType.equals(".jpeg")) {
            return "image/jpeg";
        } else if (fileType.equals(".png")) {
            return "image/png";
        } else {
            return "application/octet-stream";
        }
    }

    /**
     * 获取文件的访问URL
     * @param objectName 文件路径
     * @return 文件的访问URL
     */
    public String getFileUrl(String objectName) {
        try {
            // 设置URL过期时间为1小时
            Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000);
            // 生成签名URL
            URL url = ossClient.generatePresignedUrl(ossConfig.getBucketName(), objectName, expiration);
            return url.toString();
        } catch (Exception e) {
            throw new RuntimeException("获取文件访问URL失败", e);
        }
    }
}
